package br.com.freelancer.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Classe para auxiliar o tratamento de campos do tipo Telefone
 * 
 * @author Walter Fontes
 */
public class TelefoneHelper {
	
	//Construtor privado. Os métodos devem ser estáticos
	private TelefoneHelper() {}
	
	
	/**
	 * Método para retirar qualquer caractere não numérico de uma String
	 * 
	 * @param telefone
	 * @return
	 */
	public static final int retiraCaracteresAlpha(String telefone) {
		return Integer.parseInt(telefone.replaceAll("[^0-9]+", ""));
	}
	
	
    /**
     * Formata telefone em (##) ####-####
     * 
     * @param valor
     * @return
     */
    public static String obtemTelefoneFormatado(String numero) {
    	StringBuilder numeroTel = new StringBuilder("");
    	if(numero != null){
    		
    		numeroTel = new StringBuilder(numero.replaceAll("[^0-9]+", ""));
    		if(numeroTel.toString().isEmpty()) return "";
    		if(numeroTel.length() < 10){
    			int whiteSpace = 10-numeroTel.length();
				for (int i = 0; i < whiteSpace; i++) {
					numeroTel.insert(0, " ");
				}
    		}else{
    			if(numeroTel.length()>10){
    				numeroTel = new StringBuilder(numeroTel.substring(numeroTel.length()-11, numeroTel.length()));
    			}
    		}
    		numeroTel.insert(6, "-");
    		numeroTel.insert(2, ")");
    		numeroTel.insert(0, "(");
    	}
        return numeroTel.toString();
    }
   
    
    /**
     * Formata telefone em ####-####
     * 
     * @param valor
     * @return
     */
    public static String obtemTelefoneFormatadoSemDDD(Integer numero) {
    	StringBuilder numeroTel = new StringBuilder("");
    	if(numero != null){
    		numeroTel = new StringBuilder(numero.toString());
    		if(numeroTel.toString().isEmpty()) return "";
    		if(numeroTel.length() < 8){
    			int whiteSpace = 8-numeroTel.length();
				for (int i = 0; i < whiteSpace; i++) {
					numeroTel.insert(0, " ");
				}
    		}else{
    			if(numeroTel.length()>8){
    				numeroTel = new StringBuilder(numeroTel.substring(numeroTel.length()-9, numeroTel.length()));
    			}
    		}
    		numeroTel.insert(4, "-");
    	}
        return numeroTel.toString();
    }    
    
    public static String formataCelularSemDDD (String numero) {
    	if (ObjectHelper.isEmpty(numero)) return "";
    	if (numero.length() < 8) return "";
    	
    	if (numero.length() == 8) {
    		return obtemTelefoneFormatadoSemDDD(Integer.valueOf(numero));
    	} else if (numero .length() == 9) {
    		String primeiros5 = numero.substring(0, 5);
    		String ultimos4 = numero.substring(5, 9);
    		return primeiros5+"-"+ultimos4;
    	} else return "";
    }
    
    /**
     * Valida o formato do telefone
     * OBS: Usar este método para TODAS as validações de telefone
     * 
     * @param dddTelefone
     * @param nroTelefone
     * @param isCelular 
     * @param ordemTelefone Ordem do telefone (Exemplo: '1' para o primeiro campo de Celular, '2' para o segundo campo de Celular)
     * @param msgErro 
     * @return Retorna a mensagem de erro
     */
    public static String validaFormatoTelefone(String dddTelefone,String nroTelefone,final boolean isCelular, String ordemTelefone, String msgErro) {
    	
    	if (ObjectHelper.isEmpty(dddTelefone) || ObjectHelper.isEmpty(nroTelefone)) return null;
    	
    	ordemTelefone = (ObjectHelper.isEmpty(ordemTelefone))?" ":" "+ordemTelefone+" ";
    	
    	dddTelefone = retiraCaractersEspeciaisTelefone(dddTelefone);
    	
    	nroTelefone = retiraCaractersEspeciaisTelefone(nroTelefone);
    	
    	if(isCelular) {
    		if(dddTelefone.equals(11)) {
    			return validaFormatoTelefoneSP(dddTelefone, nroTelefone, ordemTelefone);
    		}
    		
    		Pattern pDDD = Pattern.compile("^[0-9]{2}$");  
    		Matcher mDDD = pDDD.matcher(dddTelefone);
    		
    		Pattern pNro = Pattern.compile("^([0-9]{8})$");  
    		Matcher mNro = pNro.matcher(nroTelefone);
    		
    		if(!(mDDD.matches() && mNro.matches())){
    			return "Celular"+ordemTelefone+"deve ter 8 dígitos";
    		}
    		
    	} else {
    		Pattern pDDD = Pattern.compile("^[0-9]{2}$");  
    		Matcher mDDD = pDDD.matcher(dddTelefone);
    		
    		Pattern pNro = Pattern.compile("^([0-9]{8})$");  
    		Matcher mNro = pNro.matcher(nroTelefone);
    		
    		if(!(mDDD.matches() && mNro.matches())){
    			return "Telefone deve ter 8 dígitos";
    		}
    	}
		return null;
	}


	/**
	 * 
	 * Retira os caracters especiais de número ou ddd de telefone
	 * 
	 * @param numeroTelefone
	 * @return
	 */
	private static String retiraCaractersEspeciaisTelefone(String numeroTelefone) {
		return numeroTelefone.replaceAll("\\-", "").replaceAll("\\_", "").replaceAll("\\)", "").replaceAll("\\(", "");
	}
	
    private static String validaFormatoTelefoneSP(String dddTelefone, String nroTelefone, final String ordemTelefone) {
    	
    	String[] indexNextel = null;
    	String listaNextel = "7";
    	indexNextel = listaNextel.split(",");
    	
    	boolean isNextel = false;
    	
    	if (nroTelefone.length() == 9) {
    		for (int i = 0; i<indexNextel.length; i++) {
    			if(indexNextel[i].equals(nroTelefone.substring(1,5))) {
					isNextel = true;
    				return "Nextel"+ordemTelefone+"deve ter 8 dígitos";
	    		}
    		}
    	} else if(nroTelefone.length() == 8)  {
    		for (int i = 0; i<indexNextel.length; i++) {
	    		if(indexNextel[i].equals(nroTelefone.substring(0,4))) {
					isNextel = true;
					return null;
	    		}
    		}
    	}
    	    	
		if(!isNextel) {
			if (nroTelefone.length() < 9) {
				return "Celular"+ordemTelefone+"deve ter 9 dígitos";
			}
			if(!nroTelefone.substring(0,1).equals("9")){
				return "Celular"+ordemTelefone+"inválido";
			}
		}
    	return null;
	}
    
    public static boolean validaFormatoTelefone(String tel) {
    	
    	if (tel == null ) return false;
    	
		Pattern nTel = Pattern.compile("\\([0-9]{2}\\) ([0-9]{4})-([0-9]{4})");  
		Matcher mNro = nTel.matcher(tel);

		return mNro.matches() ;
	}
    public static boolean validaFormatoTelefoneSP(String tel) {
    	
    	if (tel == null ) return false;
    	
		Pattern nTel = Pattern.compile("\\([1]{2}\\) (9[0-9]{3})-([0-9]{5})");  
		Matcher mNro = nTel.matcher(tel);

		return mNro.matches() ;
	}
	public static String obtemNumeroTelefoneFormatado(String string) {
		if(ObjectHelper.isNotEmpty(string)){
			StringBuilder stringBuilder = new StringBuilder(string.replaceAll(" ", ""));
			if(stringBuilder.length() < 9){
				int whiteSpace = 11-stringBuilder.length();
				for (int i = 0; i < whiteSpace; i++) {
					stringBuilder.insert(0, " ");
				}
			}
			stringBuilder.insert(4, "-");
			return stringBuilder.toString();
		}
		return "";
	}


	public static String obtemDddTelefoneFormatado(String string) {
		if(ObjectHelper.isNotEmpty(string)){
			return string.replaceAll(" ", "");
		}
		return "";
	}
}
